home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / Python-1.4 / Demo / scripts / lpwatch.py < prev    next >
Text File  |  1998-06-24  |  3KB  |  110 lines

  1. #! /usr/local/bin/python
  2.  
  3. # Watch line printer queue(s).
  4. # Intended for BSD 4.3 lpq.
  5.  
  6. import posix
  7. import sys
  8. import time
  9. import string
  10.  
  11. DEF_PRINTER = 'psc'
  12. DEF_DELAY = 10
  13.  
  14. def main():
  15.     delay = DEF_DELAY # XXX Use getopt() later
  16.     try:
  17.         thisuser = posix.environ['LOGNAME']
  18.     except:
  19.         thisuser = posix.environ['USER']
  20.     printers = sys.argv[1:]
  21.     if printers:
  22.         # Strip '-P' from printer names just in case
  23.         # the user specified it...
  24.         for i in range(len(printers)):
  25.             if printers[i][:2] == '-P':
  26.                 printers[i] = printers[i][2:]
  27.     else:
  28.         if posix.environ.has_key('PRINTER'):
  29.             printers = [posix.environ['PRINTER']]
  30.         else:
  31.             printers = [DEF_PRINTER]
  32.     #
  33.     clearhome = posix.popen('clear', 'r').read()
  34.     #
  35.     while 1:
  36.         text = clearhome
  37.         for name in printers:
  38.             text = text + makestatus(name, thisuser) + '\n'
  39.         print text
  40.         time.sleep(delay)
  41.  
  42. def makestatus(name, thisuser):
  43.     pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
  44.     lines = []
  45.     users = {}
  46.     aheadbytes = 0
  47.     aheadjobs = 0
  48.     userseen = 0
  49.     totalbytes = 0
  50.     totaljobs = 0
  51.     while 1:
  52.         line = pipe.readline()
  53.         if not line: break
  54.         fields = string.split(line)
  55.         n = len(fields)
  56.         if len(fields) >= 6 and fields[n-1] == 'bytes':
  57.             rank = fields[0]
  58.             user = fields[1]
  59.             job = fields[2]
  60.             files = fields[3:-2]
  61.             bytes = eval(fields[n-2])
  62.             if user == thisuser:
  63.                 userseen = 1
  64.             elif not userseen:
  65.                 aheadbytes = aheadbytes + bytes
  66.                 aheadjobs = aheadjobs + 1
  67.             totalbytes = totalbytes + bytes
  68.             totaljobs = totaljobs + 1
  69.             if users.has_key(user):
  70.                 ujobs, ubytes = users[user]
  71.             else:
  72.                 ujobs, ubytes = 0, 0
  73.             ujobs = ujobs + 1
  74.             ubytes = ubytes + bytes
  75.             users[user] = ujobs, ubytes
  76.         else:
  77.             if fields and fields[0] <> 'Rank':
  78.                 line = string.strip(line)
  79.                 if line == 'no entries':
  80.                     line = name + ': idle'
  81.                 elif line[-22:] == ' is ready and printing':
  82.                     line = name
  83.                 lines.append(line)
  84.     #
  85.     if totaljobs:
  86.         line = `(totalbytes+1023)/1024` + ' K'
  87.         if totaljobs <> len(users):
  88.             line = line + ' (' + `totaljobs` + ' jobs)'
  89.         if len(users) == 1:
  90.             line = line + ' for ' + users.keys()[0]
  91.         else:
  92.             line = line + ' for ' + `len(users)` + ' users'
  93.             if userseen:
  94.                 if aheadjobs == 0:
  95.                   line =  line + ' (' + thisuser + ' first)'
  96.                 else:
  97.                   line = line + ' (' + `(aheadbytes+1023)/1024`
  98.                   line = line + ' K before ' + thisuser + ')'
  99.         lines.append(line)
  100.     #
  101.     sts = pipe.close()
  102.     if sts:
  103.         lines.append('lpq exit status ' + `sts`)
  104.     return string.joinfields(lines, ': ')
  105.  
  106. try:
  107.     main()
  108. except KeyboardInterrupt:
  109.     pass
  110.